﻿// 801 移棋子游戏.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
/*
http://oj.daimayuan.top/course/22/problem/903

有个n×m的棋盘，其中(1,1)格在左上角，(n,m)格在右下角。
棋盘的第一行和第一列的每个格子标了黑白两种颜色。

上面有一个棋子。Alice和Bob轮流移动这个棋子，Alice先手移动。
每次可以往上或往左移动一格，一旦这个棋子移动到第一行或者第一列游戏结束。
执行最后一步移动的人，如果将棋子移动到黑格，那么就获胜，否则就失败。

现在给这个棋子的起始位置，问最后获胜的玩家是谁，对于所有(i,j)
满足2≤i≤n,2≤j≤m输出。

输入格式
第一行两个整数n,m(2≤n,m≤1000)。

接下来一行m−1
个由BW构成的字符串，分别表示第一行2
到m
格的颜色，其中B是黑色，W是白色。

接下来一行n−1
个由BW构成的字符串，分别表示第一列2
到n
格的颜色，其中B是黑色，W是白色。

输出格式
一共n−1
行，每行m−1
个字母，表示胜者。如果Alice获胜，输出一个A，否则输出一个B。

样例输入
3 4
WBW
BW
样例输出
AAB
BAA
*/

#include <iostream>


using namespace std;

const int N = 1010;
int dp[N][N];
int n, m;
char row[1010], col[1010];


int main()
{
	cin >> n >> m;
	cin >> &row[2] >> &col[2];

	if (row[2] == 'B' || col[2] == 'B') dp[2][2] = 1;

	for (int i = 3; i <= m; i++) {
		if (row[i] == 'B' || dp[2][i - 1] == 0)  dp[2][i] = 1;
	}

	for (int j = 3; j <= n; j++) {
		if (col[j] == 'B' || dp[j - 1][2] == 0) dp[j][2] = 1;
	}

	for (int i = 3; i <= n; i++) {
		for (int j = 3; j <= m; j++) {
			dp[i][j] = !(dp[i - 1][j] & dp[i][j - 1]);
		}
	}

	for (int i = 2; i <= n; i++) {
		for (int j = 2; j <= m; j++) {
			if (dp[i][j]) {
				cout << "A";
			}
			else {
				cout << "B";
			}
		}
		cout << endl;
	}
	


	return 0;
}

 